using CommunityToolkit.Mvvm.ComponentModel;

namespace RadioTimer.Models
{
    /// <summary>
    /// 时间报时设置模型类
    /// 用于存储每个小时的报时配置信息，包括是否启用、播报内容、音量等设置
    /// 继承自ObservableObject以支持数据绑定
    /// </summary>
    public partial class TimeChimeSettings : ObservableObject
    {
        #region 私有字段
        
        /// <summary>
        /// 该小时是否启用报时的私有字段
        /// </summary>
        [ObservableProperty]
        private bool _isEnabled = true;
        
        /// <summary>
        /// 是否包含农历信息的私有字段
        /// </summary>
        [ObservableProperty]
        private bool _includeLunarCalendar;
        
        /// <summary>
        /// 是否包含公历信息的私有字段
        /// </summary>
        [ObservableProperty]
        private bool _includeGregorianCalendar = true;
        
        /// <summary>
        /// 是否包含星期信息的私有字段
        /// </summary>
        [ObservableProperty]
        private bool _includeWeekday = true;
        
        /// <summary>
        /// 播放音量的私有字段，范围0.0-1.0
        /// </summary>
        [ObservableProperty]
        private double _volume = 0.8;
        
        /// <summary>
        /// 重复播放次数的私有字段，范围1-5
        /// </summary>
        [ObservableProperty]
        private int _repeatCount = 1;
        
        #endregion

        #region 公共属性
        
        /// <summary>
        /// 获取或设置小时值（0-23）
        /// 表示该设置对应的小时时间
        /// </summary>
        public int Hour { get; set; }
        
        #endregion
        
        #region 性能优化方法
        
        /// <summary>
        /// 批量更新属性而不触发多次通知
        /// </summary>
        /// <param name="isEnabled">是否启用</param>
        /// <param name="volume">音量</param>
        /// <param name="repeatCount">重复次数</param>
        public void UpdateSettings(bool isEnabled, double volume, int repeatCount)
        {
            _isEnabled = isEnabled;
            _volume = volume;
            _repeatCount = repeatCount;
            
            // 手动触发一次通知
            OnPropertyChanged(nameof(IsEnabled));
            OnPropertyChanged(nameof(Volume));
            OnPropertyChanged(nameof(RepeatCount));
        }
        
        #endregion
    }
}